<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>模型量化 | 455のblog</title>
  <meta name="keywords" content=" 模型量化 , PTQ , QAT ">
  <meta name="description" content="模型量化 | 455のblog">
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="description" content="为什么需要激活函数？神经网络的每一个神经元的工作流程可以总结为下图：  数学表达：  那么为什么需要激活函数？ 从上图可以看出，神经网络中每一层的输入输出其实都是一个线性求和的过程，下一层的输出只是承接了上一层输入函数的线性变换，所以如果没有激活函数，那么无论你构造的神经网络多么复杂，有多少层，最后的输出都是输入的线性组合，纯粹的线性组合并不能够解决更为复杂的问题。激活函数可以向神经网络中引入非线">
<meta property="og:type" content="article">
<meta property="og:title" content="激活函数">
<meta property="og:url" content="http://example.com/2022/07/10/%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0/index.html">
<meta property="og:site_name" content="455のblog">
<meta property="og:description" content="为什么需要激活函数？神经网络的每一个神经元的工作流程可以总结为下图：  数学表达：  那么为什么需要激活函数？ 从上图可以看出，神经网络中每一层的输入输出其实都是一个线性求和的过程，下一层的输出只是承接了上一层输入函数的线性变换，所以如果没有激活函数，那么无论你构造的神经网络多么复杂，有多少层，最后的输出都是输入的线性组合，纯粹的线性组合并不能够解决更为复杂的问题。激活函数可以向神经网络中引入非线">
<meta property="og:locale" content="en_US">
<meta property="og:image" content="http://example.com/img/Activate/1.jpg">
<meta property="og:image" content="http://example.com/img/Activate/2.jpg">
<meta property="og:image" content="http://example.com/img/Activate/3.jpg">
<meta property="og:image" content="http://example.com/img/Activate/4.jpg">
<meta property="article:published_time" content="2022-07-10T08:41:09.000Z">
<meta property="article:modified_time" content="2022-07-17T07:15:59.379Z">
<meta property="article:author" content="Jilei Hou">
<meta property="article:tag" content="ONNX">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="http://example.com/img/Activate/1.jpg">


<link rel="icon" href="/img/IMG_1649.JPG">

<link href="/css/style.css?v=1.1.0" rel="stylesheet">

<link href="/css/hl_theme/github.css?v=1.1.0" rel="stylesheet">

<link href="//cdn.jsdelivr.net/npm/animate.css@4.1.0/animate.min.css" rel="stylesheet">

<script src="//cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script>
<script src="/js/titleTip.js?v=1.1.0" ></script>

<script src="//cdn.jsdelivr.net/npm/highlightjs@9.16.2/highlight.pack.min.js"></script>
<script>
    hljs.initHighlightingOnLoad();
</script>

<script src="//cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.js"></script>



<script src="//cdn.jsdelivr.net/npm/jquery.cookie@1.4.1/jquery.cookie.min.js" ></script>

<script src="/js/iconfont.js?v=1.1.0" ></script>

<meta name="generator" content="Hexo 6.2.0"></head>
<div style="display: none">
  <input class="theme_disqus_on" value="false">
  <input class="theme_preload_comment" value="">
  <input class="theme_blog_path" value="">
  <input id="theme_shortcut" value="true" />
  <input id="theme_highlight_on" value="true" />
  <input id="theme_code_copy" value="true" />
</div>



<body>
<aside class="nav">
    <div class="nav-left">
        <a href="/"
   class="avatar_target">
    <img class="avatar"
         src="/img/IMG_1649.JPG"/>
</a>
<div class="author">
    <span>Jilei Hou</span>
</div>

<div class="icon">
    
        
            <a title="github"
               href="https://github.com/Jilei-Hou"
               target="_blank">
                
                    <svg class="iconfont-svg" aria-hidden="true">
                        <use xlink:href="#icon-github"></use>
                    </svg>
                
            </a>
        
    
        
            <a title="email"
               href="mailto:houjilei455@qq.com"
               target="_blank">
                
                    <svg class="iconfont-svg" aria-hidden="true">
                        <use xlink:href="#icon-email"></use>
                    </svg>
                
            </a>
        
    
        
            <a title="qq"
               href="http://wpa.qq.com/msgrd?v=3&uin=305509299&site=qq&menu=yes"
               target="_blank">
                
                    <svg class="iconfont-svg" aria-hidden="true">
                        <use xlink:href="#icon-qq"></use>
                    </svg>
                
            </a>
        
    
</div>




<ul>
    <li>
        <div class="all active" data-rel="All">All
            
                <small>(6)</small>
            
        </div>
    </li>
    
        
            
                <li>
                    <div data-rel="好玩的技术">
                        
                        好玩的技术
                        <small>(1)</small>
                        
                    </div>
                    
                </li>
            
        
    
        
            
                <li>
                    <div data-rel="论文分享">
                        
                        论文分享
                        <small>(1)</small>
                        
                    </div>
                    
                </li>
            
        
    
        
            
                <li>
                    <div data-rel="模型量化">
                        <i class="fold iconfont icon-right"></i>
                        
                        模型量化
                        <small>(4)</small>
                        
                    </div>
                    
                        <ul class="sub hide">
                            
                                <li>
                                    <div data-rel="模型量化<--->算子">
                                        
                                        算子
                                        
                                            <small>(3
                                                )</small>
                                        
                                    </div>
                                    
                                </li>
                            
                        </ul>
                    
                </li>
            
        
    
        
            
        
    
</ul>
<div class="left-bottom">
    <div class="menus">
        
            
            
            
    </div>
    <div>
        
        
    </div>
</div>
<input type="hidden" id="yelog_site_posts_number" value="6">
<input type="hidden" id="yelog_site_word_count" value="6.6k">
<div style="display: none">
    <span id="busuanzi_value_site_uv"></span>
    <span id="busuanzi_value_site_pv"></span>
</div>

    </div>
    <div class="nav-right">
        <div class="friends-area">
    <div class="friends-title">
        Links
        <i class="iconfont icon-left"></i>
    </div>
    <div class="friends-content">
        <ul>
            
            <li><a target="_blank" href="http://yelog.org/">叶落阁</a></li>
            
        </ul>
    </div>
</div>
        <div class="title-list">
    <div class="right-top">
        <div id="default-panel">
            <i class="iconfont icon-search" data-title="搜索 快捷键 i"></i>
            <div class="right-title">All</div>
            <i class="iconfont icon-file-tree" data-title="切换到大纲视图 快捷键 w"></i>
        </div>
        <div id="search-panel">
            <i class="iconfont icon-left" data-title="返回"></i>
            <input id="local-search-input" autocomplete="off"/>
            <label class="border-line" for="input"></label>
            <i class="iconfont icon-case-sensitive" data-title="大小写敏感"></i>
            <i class="iconfont icon-tag" data-title="标签"></i>
        </div>
        <div id="outline-panel" style="display: none">
            <div class="right-title">大纲</div>
            <i class="iconfont icon-list" data-title="切换到文章列表"></i>
        </div>
    </div>

    <div class="tags-list">
    <input id="tag-search" />
    <div class="tag-wrapper">
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>代码生成</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>模型量化</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>自然语言处理</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Conv</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>GitHub</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>GPT</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>Hexo</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>ONNX</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>PTQ</a>
            </li>
        
            <li class="article-tag-list-item">
                <i class="iconfont icon-tag"></i><a>QAT</a>
            </li>
        
    </div>

</div>

    
    <nav id="title-list-nav">
        
        <a  class="All 模型量化 算子 "
           href="/2022/07/10/%E6%BF%80%E6%B4%BB%E5%87%BD%E6%95%B0/"
           data-tag="ONNX"
           data-author="" >
            <span class="post-title" title="激活函数">激活函数</span>
            <span class="post-date" title="2022-07-10 16:41:09">2022/07/10</span>
        </a>
        
        <a  class="All 模型量化 算子 "
           href="/2022/07/09/Conv/"
           data-tag="Conv,ONNX"
           data-author="" >
            <span class="post-title" title="Conv">Conv</span>
            <span class="post-date" title="2022-07-09 14:26:09">2022/07/09</span>
        </a>
        
        <a  class="All 模型量化 "
           href="/2022/06/18/%E6%A8%A1%E5%9E%8B%E9%87%8F%E5%8C%96/"
           data-tag="模型量化,PTQ,QAT"
           data-author="" >
            <span class="post-title" title="模型量化">模型量化</span>
            <span class="post-date" title="2022-06-18 15:13:55">2022/06/18</span>
        </a>
        
        <a  class="All 模型量化 算子 "
           href="/2022/06/12/Conv_Gemm_MatMul%E4%B9%8B%E9%97%B4%E7%9A%84%E8%81%94%E7%B3%BB/"
           data-tag="Conv,ONNX"
           data-author="" >
            <span class="post-title" title="Conv Gemm MatMul之间的联系">Conv Gemm MatMul之间的联系</span>
            <span class="post-date" title="2022-06-12 14:35:00">2022/06/12</span>
        </a>
        
        <a  class="All 好玩的技术 "
           href="/2022/06/11/Hexo+GitHub/"
           data-tag="Hexo,GitHub"
           data-author="" >
            <span class="post-title" title="Hexo+GitHub搭建属于你的博客">Hexo+GitHub搭建属于你的博客</span>
            <span class="post-date" title="2022-06-11 16:55:00">2022/06/11</span>
        </a>
        
        <a  class="All 论文分享 "
           href="/2022/06/11/Codex/"
           data-tag="自然语言处理,GPT,代码生成"
           data-author="" >
            <span class="post-title" title="Codex">Codex</span>
            <span class="post-date" title="2022-06-11 16:38:00">2022/06/11</span>
        </a>
        
        <div id="no-item-tips">

        </div>
    </nav>
    <div id="outline-list">
    </div>
</div>

    </div>
    <div class="hide-list">
        <div class="semicircle" data-title="切换全屏 快捷键 s">
            <div class="brackets first"><</div>
            <div class="brackets">&gt;</div>
        </div>
    </div>
</aside>
<div id="post">
    <div class="pjax">
        <article id="post-模型量化" class="article article-type-post" itemscope itemprop="blogPost">
    
        <h1 class="article-title">模型量化</h1>
    
    <div class="article-meta">
        
        
        
        <span class="book">
            <i class="iconfont icon-category"></i>
            
            
            <a  data-rel="模型量化">模型量化</a>
            
        </span>
        
        
        <span class="tag">
            <i class="iconfont icon-tag"></i>
            
            <a class="color5">模型量化</a>
            
            <a class="color4">PTQ</a>
            
            <a class="color4">QAT</a>
            
        </span>
        
    </div>
    <div class="article-meta">
        
            Created At : <time class="date" title='Updated At: 2022-06-19 20:46:36'>2022-06-18 15:13</time>
        
    </div>
    <div class="article-meta">
        
        <span>Count:2.3k</span>
        
        
        <span id="busuanzi_container_page_pv">
            Views 👀 :<span id="busuanzi_value_page_pv">
                <span class="count-comment">
                    <span class="spinner">
                      <div class="cube1"></div>
                      <div class="cube2"></div>
                    </span>
                </span>
            </span>
        </span>
        
        
    </div>
    
    <div class="toc-ref">
    
        <ol class="toc"><li class="toc-item toc-level-1"><a class="toc-link" href="#What%EF%BC%9A%E4%BB%80%E4%B9%88%E6%98%AF%E6%A8%A1%E5%9E%8B%E9%87%8F%E5%8C%96"><span class="toc-text">What：什么是模型量化</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#Why%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81%E6%A8%A1%E5%9E%8B%E9%87%8F%E5%8C%96"><span class="toc-text">Why：为什么需要模型量化</span></a></li><li class="toc-item toc-level-1"><a class="toc-link" href="#How%EF%BC%9A%E6%80%8E%E4%B9%88%E8%BF%9B%E8%A1%8C%E6%A8%A1%E5%9E%8B%E9%87%8F%E5%8C%96"><span class="toc-text">How：怎么进行模型量化</span></a><ol class="toc-child"><li class="toc-item toc-level-2"><a class="toc-link" href="#%E7%BA%BF%E6%80%A7%E9%87%8F%E5%8C%96%E4%B8%8E%E9%9D%9E%E7%BA%BF%E6%80%A7%E9%87%8F%E5%8C%96"><span class="toc-text">线性量化与非线性量化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E7%BA%BF%E6%80%A7%E9%87%8F%E5%8C%96"><span class="toc-text">线性量化</span></a><ol class="toc-child"><li class="toc-item toc-level-4"><a class="toc-link" href="#%E9%9D%9E%E5%AF%B9%E7%A7%B0%E9%87%8F%E5%8C%96"><span class="toc-text">非对称量化</span></a><ol class="toc-child"><li class="toc-item toc-level-5"><a class="toc-link" href="#%E4%B8%BE%E4%BE%8B%EF%BC%9A"><span class="toc-text">举例：</span></a></li></ol></li><li class="toc-item toc-level-4"><a class="toc-link" href="#%E5%AF%B9%E7%A7%B0%E9%87%8F%E5%8C%96%EF%BC%88%E4%B8%80%E7%A7%8D%E7%89%B9%E6%AE%8A%E7%9A%84%E9%9D%9E%E5%AF%B9%E7%A7%B0%E9%87%8F%E5%8C%96%EF%BC%89"><span class="toc-text">对称量化（一种特殊的非对称量化）</span></a></li></ol></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%9D%9E%E7%BA%BF%E6%80%A7%E9%87%8F%E5%8C%96"><span class="toc-text">非线性量化</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#%E9%A5%B1%E5%92%8C%E9%87%8F%E5%8C%96%E4%B8%8E%E9%9D%9E%E9%A5%B1%E5%92%8C%E9%87%8F%E5%8C%96"><span class="toc-text">饱和量化与非饱和量化</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%9D%9E%E9%A5%B1%E5%92%8C%E9%87%8F%E5%8C%96"><span class="toc-text">非饱和量化</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%A5%B1%E5%92%8C%E9%87%8F%E5%8C%96"><span class="toc-text">饱和量化</span></a></li></ol></li><li class="toc-item toc-level-2"><a class="toc-link" href="#PTQ-%E4%B8%8E-QAT"><span class="toc-text">PTQ 与 QAT</span></a><ol class="toc-child"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%90%8E%E8%AE%AD%E7%BB%83%E9%87%8F%E5%8C%96%EF%BC%88Post-Training-Quantization-PTQ%EF%BC%89"><span class="toc-text">后训练量化（Post-Training Quantization, PTQ）</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%87%8F%E5%8C%96%E6%84%9F%E7%9F%A5%E8%AE%AD%E7%BB%83%EF%BC%88Quantization-Aware-Training-QAT%EF%BC%89"><span class="toc-text">量化感知训练（Quantization Aware Training, QAT）</span></a></li></ol></li></ol></li><li class="toc-item toc-level-1"><a class="toc-link" href="#%E5%8F%82%E8%80%83%E9%93%BE%E6%8E%A5%EF%BC%9A"><span class="toc-text">参考链接：</span></a></li></ol>
    
<style>
    .left-col .switch-btn,
    .left-col .switch-area {
        display: none;
    }
    .toc-level-6 i,
    .toc-level-6 ol {
        display: none !important;
    }
</style>
</div>
    
    <div class="article-entry" itemprop="articleBody">
      
        <h1 id="What：什么是模型量化"><a href="#What：什么是模型量化" class="headerlink" title="What：什么是模型量化"></a>What：什么是模型量化</h1><p>简单来说，<strong>模型量化（Model Quantization）就是通过某种方法将浮点模型转为定点模型</strong>。比如说原来的模型里面的权重（weight）都是float32，通过模型量化，将模型变成权重（weight）都是int8的定点模型。</p>
<h1 id="Why：为什么需要模型量化"><a href="#Why：为什么需要模型量化" class="headerlink" title="Why：为什么需要模型量化"></a>Why：为什么需要模型量化</h1><p>随着深度学习（Deep Learning）的发现，其在计算机视觉（Computer Vision， CV）和自然语言处理（Natural Language Processing，NLP）等领域都取得了巨大的成功。通过深度学习，我们可以得到用于处理各种任务的高性能模型，这些模型大多都很复杂、一般只适合在GPU上进行推理，并不适合在板端进行推理，然而在实际应用时，很多场景都需要将模型部署到板端。</p>
<p>为了解决模型难以部署到板端的问题，我们就需要通过<strong>模型量化</strong>来降低模型的复杂性，这个过程不可避免的会发生精度损失。</p>
<p>量化前的浮点模型和量化后的定点模型的特点：</p>
<table>
<thead>
<tr>
<th align="center">量化前的浮点模型</th>
<th align="center">量化后的定点模型</th>
</tr>
</thead>
<tbody><tr>
<td align="center">参数量大（float32）</td>
<td align="center">压缩参数（int8）</td>
</tr>
<tr>
<td align="center">计算量大</td>
<td align="center">提升速度</td>
</tr>
<tr>
<td align="center">内存占用多</td>
<td align="center">内存占用少</td>
</tr>
<tr>
<td align="center">精度高</td>
<td align="center">精度损失</td>
</tr>
</tbody></table>
<h1 id="How：怎么进行模型量化"><a href="#How：怎么进行模型量化" class="headerlink" title="How：怎么进行模型量化"></a>How：怎么进行模型量化</h1><p>模型量化就是建立一种浮点数据和定点数据间的映射关系，使得以较小的精度损失代价获得了较大的收益，要弄懂模型量化的原理就是要弄懂这种数据映射关系。</p>
<h2 id="线性量化与非线性量化"><a href="#线性量化与非线性量化" class="headerlink" title="线性量化与非线性量化"></a>线性量化与非线性量化</h2><h3 id="线性量化"><a href="#线性量化" class="headerlink" title="线性量化"></a>线性量化</h3><p>采用相同的量化间隔对输入作量化</p>
<p>根据Z (zero_point) 是否为0，线性量化可以分为对称量化和非对称量化</p>
<h4 id="非对称量化"><a href="#非对称量化" class="headerlink" title="非对称量化"></a>非对称量化</h4><p>浮点0对应的值不是定点0</p>
<p>浮点和定点之间的映射公式：</p>
<blockquote>
<p><strong>Q &#x3D; clamp(Round(R&#x2F;S + Z)) &#x3D; Q<sub>max</sub>,                       R∈float且R&gt;T<sub>max</sub></strong></p>
<p><strong>Q &#x3D; clamp(Round(R&#x2F;S + Z)) &#x3D; Round(R&#x2F;S + Z),    R∈float且T<sub>min</sub>&lt;R&lt;T<sub>max</sub></strong></p>
<p><strong>Q &#x3D; clamp(Round(R&#x2F;S + Z)) &#x3D; Q<sub>min</sub>,                       R∈float且R&lt;T<sub>min</sub></strong></p>
</blockquote>
<blockquote>
<p><strong>R &#x3D; (Q - Z) * S</strong></p>
</blockquote>
<p>其中，Q表示量化后的定点数，R表示量化前的浮点数，Z就是zero_point，即浮点数映射到定点之后，浮点0所对应的定点值。S就是scale，即缩放尺度。Round()函数就是四舍五入。clamp()函数的作用是把一个值限制在一个上限和下限之间。T<sub>max</sub>表示浮点数的最大阈值，T<sub>min</sub>表示浮点数的最小阈值。Q<sub>max</sub>表示定数的最大值，Q<sub>min</sub>表示定点数的最小值。</p>
<p>通过换算可以得到阈值和线性映射参数 S 和 Z 的数学关系，在确定了阈值后，也就确定了线性映射的参数。</p>
<blockquote>
<p><strong>S &#x3D; (T<sub>max</sub> - T<sub>min</sub>) &#x2F; (Q<sub>max</sub> - Q<sub>min</sub>)</strong></p>
</blockquote>
<blockquote>
<p><strong>Z &#x3D; Q<sub>max</sub> - T<sub>max</sub>&#x2F;S</strong></p>
</blockquote>
<table>
<thead>
<tr>
<th align="center">数据类型</th>
<th align="center">取值范围</th>
</tr>
</thead>
<tbody><tr>
<td align="center">float32</td>
<td align="center">-2^31 ~ 2^31-1</td>
</tr>
<tr>
<td align="center">int8</td>
<td align="center">-2^7 ~ 2^7-1 (-128 ~ 127)</td>
</tr>
<tr>
<td align="center">uint8</td>
<td align="center">0 ~ 2^8-1 (0~255)</td>
</tr>
</tbody></table>
<p>从上述的映射关系中，如果知道了阈值，那么其对应的线性映射参数也就知道了，整个量化过程也就明确了。</p>
<p>那么该如何确定阈值呢？</p>
<p>一般来说，对于权重的量化，由于权重的数据分布是静态的，一般直接找出 MIN 和 MAX 线性映射即可；而对于推理激活值来说，其数据分布是动态的，为了得到激活值的数据分布，往往需要一个所谓校准集的东西来进行抽样分布，有了抽样分布后再通过一些量化算法进行量化阈值的选取（饱和量化）。</p>
<h5 id="举例："><a href="#举例：" class="headerlink" title="举例："></a>举例：</h5><p>模型训练后权重或激活值往往在一个有限的范围内分布，如权重值范围为[-2.0, 6.0]，即T<sub>max</sub> &#x3D; 6.0，T<sub>min</sub> &#x3D; -2.0（非饱和量化）。然后我们用int8进行模型量化，则定点量化值范围为[-128, 127]，即Q<sub>max</sub> &#x3D; 127，Q<sub>min</sub> &#x3D; -127，那么S和Z的求值过程如下：</p>
<blockquote>
<p>S &#x3D; 6.0 - (-2.0) &#x2F; (127 - (-128)) &#x3D; 8.0 &#x2F; 255 ≈ 0.03137255</p>
</blockquote>
<blockquote>
<p>Z &#x3D; 127 - 6.0 &#x2F; 0.03137255 ≈ 127 - 191.25 ≈ -64.25 ≈ -64</p>
</blockquote>
<p>可以得到如下对应关系：</p>
<table>
<thead>
<tr>
<th align="center">浮点数</th>
<th align="center">定点数</th>
</tr>
</thead>
<tbody><tr>
<td align="center">6.0</td>
<td align="center">-128</td>
</tr>
<tr>
<td align="center">0</td>
<td align="center">-64</td>
</tr>
<tr>
<td align="center">-2.0</td>
<td align="center">127</td>
</tr>
</tbody></table>
<p>得到量化参数S和Z后，我们就可以求任意一个浮点数对应的定点数，比如说有一个权重等于0.28，即R&#x3D;0.28</p>
<blockquote>
<p>Q &#x3D; 0.28 &#x2F; 0.03137255 + (-64) ≈ -55</p>
</blockquote>
<h4 id="对称量化（一种特殊的非对称量化）"><a href="#对称量化（一种特殊的非对称量化）" class="headerlink" title="对称量化（一种特殊的非对称量化）"></a>对称量化（一种特殊的非对称量化）</h4><p>浮点0对应的值就是定点0。对称量化对于正负数不均匀分布的情况不够友好，比如如果浮点数全部是正数，量化后的数据范围是[0, 127], [-128, 0]的范围就浪费了，减弱了int8数据的表示范围</p>
<h3 id="非线性量化"><a href="#非线性量化" class="headerlink" title="非线性量化"></a>非线性量化</h3><p>对输入进行量化时，大的输入采用大的量化间隔，小的输入采用小的量化间隔。</p>
<h2 id="饱和量化与非饱和量化"><a href="#饱和量化与非饱和量化" class="headerlink" title="饱和量化与非饱和量化"></a>饱和量化与非饱和量化</h2><p>一般而言，待量化 Op 的权重采用非饱和量化方法，待量化 Op 的激活（输入和输出）采用饱和量化方法</p>
<h3 id="非饱和量化"><a href="#非饱和量化" class="headerlink" title="非饱和量化"></a>非饱和量化</h3><p>非饱和量化是最本质也是最暴力的方法，即通过统计网络模型中每一个层中权重或激活值的绝对最大值，将其映射到127，来计算出缩放因子scale，然后使用线性映射的方式将原始的浮点数据转换到INT8的数据域中，如下图（图是从知乎<a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/362976429">帖子</a>中拿来的，图中-127应该替换为-128）</p>
<p><img src="/../img/ModelQuantization/4.jpg" alt="非饱和量化"></p>
<h3 id="饱和量化"><a href="#饱和量化" class="headerlink" title="饱和量化"></a>饱和量化</h3><p>因为模型数据（一般是激活数据）分布可能是不均匀的，直接使用非饱和量化会使得量化后的值都挤在一个很小的范围从而浪费了INT8范围内的其他空间，也就是说没有充分利用INT8（-128 ~ 127）的值域。因此我们在量化时，不是直接将数据的最大值映射到127，而是使用 KL 散度计算一个合适的阈值，将其映射为127。这样使得映射后的-128 ~ 127范围内分布相对均匀，也相当于去掉了一些不重要的因素，保留了主要成分。饱和量化如下图所示（图是从知乎<a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/362976429">帖子</a>中拿来的，图中-127应该替换为-128）。</p>
<p><img src="/../img/ModelQuantization/5.jpg" alt="饱和量化"></p>
<h2 id="PTQ-与-QAT"><a href="#PTQ-与-QAT" class="headerlink" title="PTQ 与 QAT"></a>PTQ 与 QAT</h2><h3 id="后训练量化（Post-Training-Quantization-PTQ）"><a href="#后训练量化（Post-Training-Quantization-PTQ）" class="headerlink" title="后训练量化（Post-Training Quantization, PTQ）"></a>后训练量化（Post-Training Quantization, PTQ）</h3><p>后训练量化(PTQ)可以在没有原始的训练过程的情况下，就能将预训练的FP32模型直接转换为定点模型络。PTQ最大的特点就是不需要数据或者只需要很少的校准数据集。且PTQ几乎不需要调整超参数，使得我们可以很方便的进行模型量化</p>
<h3 id="量化感知训练（Quantization-Aware-Training-QAT）"><a href="#量化感知训练（Quantization-Aware-Training-QAT）" class="headerlink" title="量化感知训练（Quantization Aware Training, QAT）"></a>量化感知训练（Quantization Aware Training, QAT）</h3><p>模型量化过程其实就是在做一件事，就是找阈值或者scale。</p>
<p>在PTQ中，阈值或者scale一般是通过统计的方法，然后人工通过一些分布相似性得到的，然而，这肯定是有误差的。而且，由于量化是每层独立进行的，所以每层的量化是不依赖于前一层量化的结果的，这就导致了在实际的inference过程中会出现误差累积的情况，进一步影响量化后的性能。所以，我们需要一种可学习的scale。QAT就是在做这样一件事情。</p>
<p>简单概括就是，我们在网络训练过程去模拟量化，我们通过设定一个可学习的scale，这个scale一般可以与权重或者激活值相绑定，然后我们利用一个量化过程 q &#x3D; round(r&#x2F;s)*127，将需要量化的值量化到0-127之间，再接着一个反量化过程q * s，就实现了一个误差的传递，接着我们利用反量化后的结果继续前传，最后得到loss，我们求量化后权重的梯度，并用它来更新量化前的权重，使得这种误差被网络抹平，让网络越来越像量化后的权重靠近，最后我们得到了量化后的缩放因子s。而这一系列操作都可以写成网络中的一个op，实现网络的正常训练。</p>
<h1 id="参考链接："><a href="#参考链接：" class="headerlink" title="参考链接："></a>参考链接：</h1><p><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/132561405">模型量化了解一下？ - 知乎 (zhihu.com)</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/WZZ18191171661/article/details/103332338">模型量化详解_技术挖掘者的博客-CSDN博客_模型量化</a></p>
<p><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/79744430">Tensorflow模型量化(Quantization)原理及其实现方法 - 知乎 (zhihu.com)</a></p>
<p><a target="_blank" rel="noopener" href="https://blog.csdn.net/u010420283/article/details/114483073">模型量化-对称量化和非对称量化_Briwisdom的博客-CSDN博客_非对称量化</a></p>
<p><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/414647262">【模型推理】谈谈几种量化策略：MinMax、KLD、ADMM、EQ - 知乎 (zhihu.com)</a></p>
<p><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/362976429">INT8量化 - 知乎 (zhihu.com)</a></p>
<p><a target="_blank" rel="noopener" href="https://paddle-lite.readthedocs.io/zh/develop/user_guides/quant/quant_post_static.html">离线量化-静态离线量化 — Paddle-Lite 文档</a></p>
<p><a target="_blank" rel="noopener" href="https://zhuanlan.zhihu.com/p/463198140">再读《神经网络量化白皮书》- 0x03 训练后量化(PTQ) - 知乎 (zhihu.com)</a></p>

      
       <hr><span style="font-style: italic;color: gray;"> 转载请注明来源，欢迎对文章中的引用来源进行考证，欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论，也可以邮件至houjilei455@qq.com </span>
    </div>
</article>







    




    </div>
    <div class="copyright">
        <p class="footer-entry">
    ©2022-2022 455のblog
</p>
<p class="footer-entry">Built with <a href="https://hexo.io/" target="_blank">Hexo</a> and <a href="https://github.com/yelog/hexo-theme-3-hexo" target="_blank">3-hexo</a> theme</p>

    </div>
    <div class="full-toc">
        <button class="full" data-title="切换全屏 快捷键 s"><span class="min "></span></button>
<a class="" id="rocket" ></a>

    </div>
</div>

</body>
<script src="/js/jquery.pjax.js?v=1.1.0" ></script>

<script src="/js/script.js?v=1.1.0" ></script>
<script>
    var img_resize = 'default';
    function initArticle() {
        /*渲染对应的表格样式*/
        

        /*渲染打赏样式*/
        

        /*高亮代码块行号*/
        

        /*访问数量*/
        
        $.getScript("//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js");
        

        /*代码高亮，行号对齐*/
        $('.pre-numbering').css('line-height',$('.has-numbering').css('line-height'));

        
        
    }

    /*打赏页面隐藏与展示*/
    

</script>

<!--加入行号的高亮代码块样式-->

<!--自定义样式设置-->
<style>
    
    
    .nav {
        width: 562px;
    }
    .nav.fullscreen {
        margin-left: -562px;
    }
    .nav-left {
        width: 140px;
    }
    
    
    @media screen and (max-width: 1468px) {
        .nav {
            width: 512px;
        }
        .nav.fullscreen {
            margin-left: -512px;
        }
        .nav-left {
            width: 120px;
        }
    }
    
    
    @media screen and (max-width: 1024px) {
        .nav {
            width: 512px;
            margin-left: -512px
        }
        .nav.fullscreen {
            margin-left: 0;
        }
    }
    
    @media screen and (max-width: 426px) {
        .nav {
            width: 100%;
        }
        .nav-left {
            width: 100%;
        }
    }
    
    
    .nav-right .title-list nav a .post-title, .nav-right .title-list #local-search-result a .post-title {
        color: #383636;
    }
    
    
    .nav-right .title-list nav a .post-date, .nav-right .title-list #local-search-result a .post-date {
        color: #5e5e5f;
    }
    
    
    .nav-right nav a.hover, #local-search-result a.hover{
        background-color: #e2e0e0;
    }
    
    

    /*列表样式*/
    

    /* 背景图样式 */
    
    


    /*引用块样式*/
    

    /*文章列表背景图*/
    

    
    #post .pjax article :not(pre) > code {
        color: #24292e;
        font-family: SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace;
        background-color: rgba(27,31,35,.05);
        border-radius: 3px;
        font-size: 85%;
        margin: 0;
        padding: .2em .4em;
    }
    
</style>







</html>
